home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Belgian Amiga Club - ADF Collection
/
BS1 part 34.zip
/
BS1 part 34
/
Aztec C 5.0a disk 3.adf
/
crt_src
/
cliparse.c
< prev
next >
Wrap
C/C++ Source or Header
|
1989-10-27
|
2KB
|
87 lines
/* Copyright (C) 1986,1987 by Manx Software Systems, Inc. */
/*
* This routine is called from the _main() routine and is used to
* parse the arguments passed from the CLI to the program. It sets
* up an array of pointers to arguments in the global variables and
* and sets up _argc and _argv which will be passed by _main() to
* the main() procedure. If no arguments are ever going to be
* parsed, this routine may be replaced by a stub routine to reduce
* program size.
*
* If _arg_lin is non-zero, the _exit() routine will call FreeMem()
* with _arg_lin as the memory to free and _arg_len as the size.
*
*/
#include <libraries/dosextens.h>
#include <string.h>
#include <functions.h>
extern int _argc, _arg_len;
extern char **_argv, *_arg_lin;
extern char *_detach_name; /* for DETACHED programs */
void
_cli_parse(struct Process *pp, long alen, register char *aptr)
{
register char *cp;
register struct CommandLineInterface *cli;
register int c;
if (pp->pr_CLI) {
cli = (struct CommandLineInterface *) ((long)pp->pr_CLI << 2);
cp = (char *)((long)cli->cli_CommandName << 2);
}
else
cp = _detach_name;
_arg_len = cp[0]+alen+2;
if ((_arg_lin = AllocMem((long)_arg_len, 0L)) == 0)
return;
c = cp[0];
strncpy(_arg_lin, cp+1, (size_t)c);
strcpy(_arg_lin+c, " ");
strncat(_arg_lin, aptr, (size_t)alen);
_arg_lin[c] = 0;
for (_argc=1,aptr=cp=_arg_lin+c+1;;_argc++) {
while ((c=*cp) == ' ' || c == '\t' || c == '\f' ||
c == '\r' || c == '\n')
cp++;
if (*cp < ' ')
break;
if (*cp == '"') {
cp++;
while (c = *cp++) {
*aptr++ = c;
if (c == '"') {
if (*cp == '"')
cp++;
else {
aptr[-1] = 0;
break;
}
}
}
}
else {
while ((c=*cp++) && c != ' ' && c != '\t' && c != '\f' &&
c != '\r' && c != '\n')
*aptr++ = c;
*aptr++ = 0;
}
if (c == 0)
--cp;
}
*aptr = 0;
if ((_argv = AllocMem((long)(_argc+1)*sizeof(*_argv), 0L)) == 0) {
_argc = 0;
return;
}
for (c=0,cp=_arg_lin;c<_argc;c++) {
_argv[c] = cp;
cp += strlen(cp) + 1;
}
_argv[c] = 0;
}